const path = require("path");
const resolve = (dir) => path.join(__dirname, dir);
const isPro = ["production", "prod"].includes(process.env.NODE_ENV);
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const CompressionWebpackPlugin = require("compression-webpack-plugin");
const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
module.exports = {
    publicPath: "/", // 部署应用时的根路径(默认'/'),也可用相对路径(存在使用限制(vue-cli3使用的是'publicPath';vue-cli2使用的是'baseUrl'))
    outputDir: process.env.outputDir || "dist", // 生产环境构建文件的目录(默认''dist''，构建之前会被清除)
    assetsDir: "", //放置生成的静态资源(s、css、img、fonts)的(相对于 outputDir 的)目录(默认'')
    indexPath: "index.html", //指定生成的 index.html 的输出路径(相对于 outputDir)也可以是一个绝对路径。
    // pages: {
    //   //pages 里配置的路径和文件名在你的文档目录必须存在 否则启动服务会报错
    //   index: {
    //     //除了 entry 之外都是可选的
    //     entry: "src/main.js", // page 的入口,每个“page”应该有一个对应的 JavaScript 入口文件
    //     template: "public/index.html", // 模板来源
    //     filename: "index.html", // 在 dist/index.html 的输出
    //     title: "Index Page", // 当使用 title 选项时,在 template 中使用：<title><%= htmlWebpackPlugin.options.title %></title>
    //     chunks: ["chunk-vendors", "chunk-common", "index"], // 在这个页面中包含的块，默认情况下会包含,提取出来的通用 chunk 和 vendor chunk
    //   },
    //   subpage: "src/subpage/main.js", //官方解释：当使用只有入口的字符串格式时,模板会被推导为'public/subpage.html',若找不到就回退到'public/index.html',输出文件名会被推导为'subpage.html'
    // },
    lintOnSave: true, // 是否在保存的时候检查
    runtimeCompiler: false, // 是否使用包含运行时编译器的 Vue 构建版本
    productionSourceMap: false, // 生产环境是否生成 sourceMap 文件
    parallel: require("os").cpus().length > 1, // 启动并行化 默认 ("os").cpus().length-1
    pwa: {},
    css: {
        extract: true, // 是否使用css分离插件 ExtractTextPlugin
        sourceMap: false, // 开启 CSS source maps
        loaderOptions: {}, // css预设器配置项
        modules: false, // 启用 CSS modules for all css / pre-processor files.
    },
    chainWebpack: (config) => {
        // 修复HMR(热更新)
        config.resolve.symlinks(true);
        // 添加别名
        config.resolve.alias
            .set("@", resolve("src"))
            .set("assets", resolve("src/assets"))
            .set("components", resolve("src/components"))
            .set("layout", resolve("src/layout"))
            .set("base", resolve("src/base"))
            .set("static", resolve("src/static"));

        if (isPro) {
            // 删除预加载
            config.plugins.delete("preload");
            // 开启代码压缩
            config.optimization.minimize(true);
            // 分割代码 相同代码放一块
            config.optimization.splitChunks({
                chunks: "all",
            });
        }
    },
    devServer: {
        // 环境配置
        // host: "localhost",
        // port: 8081,
        https: false,
        hotOnly: false,
        open: false, //配置自动启动浏览器
        // open: isPro, //配置自动启动浏览器
        proxy: {
            // 配置多个代理(配置一个 proxy: 'http://localhost:8081' )
            "/v1": {
                target: "http://wxtest.shinxb.com/v1",
                ws: true,
                pathRewrite: {
                    "^/v1": "",
                },
                changeOrigin: true, //是否开启代理
            },
            "/foo": {
                target: "<other_url>",
            },
        },
    },
    pluginOptions: {
        // 第三方插件配置
        // ...
    },
    configureWebpack: (config) => {
        if (isPro) {
            // 开启gzip压缩
            const plugins_gzip = [];
            plugins_gzip.push(
                new CompressionWebpackPlugin({
                    filename: "[path].gz[query]",
                    algorithm: "gzip",
                    test: productionGzipExtensions,
                    threshold: 10240,
                    minRatio: 0.8,
                })
            );
            config.plugins = [...config.plugins, ...plugins_gzip];

            // 去除console(暂时关闭)
            const plugins_console = [];
            plugins_console.push(
                new UglifyJsPlugin({
                    uglifyOptions: {
                        warnings: false,
                        compress: {
                            drop_console: true, // 过滤 console
                            drop_debugger: true, // 过滤 debugger
                        },
                    },
                    sourceMap: false,
                    parallel: true, // 多进程
                })
            );
            config.plugins = [...config.plugins, ...plugins_console];
        }
    },
};
